package Emetteurs;
import Informations.*;
import Destinations.*;
import Transmetteurs.*;
import Sources.*;
import Sondes.*;
import Recepteurs.*;
/**
 * 
 */

/**
 * Classe EmetteurNRZTrapeze qui herite de la classe Emetteur
 * @author THIAM, 
 * @author NANOUS
 * @author GUEYE
 * @author NDIAYE
 * @param <R,T>
 *
 */
 public class EmetteurNRZTrapeze extends Emetteur {

	/**
	 * constructeur
	 * @param nbreEchantillons: le nbre d'echantillon par bit
	 * @param min: la valeur de l'amplitude min
	 * @param la valeur de l'amplitude max
	 */
	public EmetteurNRZTrapeze(int nbreEchantillons,float min,float max) {
		// TODO Auto-generated constructor stub
		super(nbreEchantillons,min,max);
		informationEmise=new Information<Float>();
	}
	
	
	/**
	    * Cette methode va recevoir les informations emises par la source
	    * @param information : l'information que le transmetteur recoit en entree
	    * @throws InformationNonConforme : Lorsque l'objet information vaut null
	    */
	public void recevoir(Information<Boolean> information)throws InformationNonConforme {
		if(information==null) throw new InformationNonConforme();
		
		this.informationRecue=information;
		emettre();
	}
	
	/**
	    * Cette methode va emetre les informations recues
	    * @throws InformationNonConforme
	    */
	public void emettre() throws InformationNonConforme{
		
		int h=(nbreEchantillons/3);
		float pas=((max-min)/h);
		Float [] inf = new Float[informationRecue.nbElements()*nbreEchantillons];
		int k=0;


		for (int i=0;i<informationRecue.nbElements();i++){
			for(int j=0;j<nbreEchantillons;j++){
				if(!informationRecue.iemeElement(i)){
					inf[k]=min;
					
				}
				else{

					if((j<h)){
						if(((i-1)>=0)&&(informationRecue.iemeElement(i-1)==true))
							inf[k]=max;
						else 
							if(j==0)
								inf[k]=min;
							else
								inf[k]=inf[k-1]+pas;
					}
					else if(j>(nbreEchantillons-h)){
						if(((i+1)<informationRecue.nbElements())&&(informationRecue.iemeElement(i+1)==true))
							inf[k]=max;
						else
							inf[k]=inf[k-1]-pas;
					}
					else{
						inf[k]=max;
					}
				}

				k++;
			}

		}
		informationEmise = new Information <Float>(inf);
		
		for( DestinationInterface <Float> destination : this.destinationsConnectees)
			destination.recevoir(this.informationEmise);
	}

}
